package interview.questions.替换空格;

/**
 * 问题：
 * <p>
 * 请实现一个函数，将一个字符串中的每个空格替换成“%20”。
 * <p>
 * 要求：
 * <p>
 * 例如，当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 */
public class Solution {
    /**
     * 解决思路：
     * <p>
     * 问题1：替换字符串，是在原来的字符串上做替换，还是新开辟一个字符串做替换！
     * 问题2：在当前字符串替换，怎么替换才更有效率（不考虑java里现有的replace方法）。
     * <p>
     * 从前往后替换，后面的字符要不断往后移动，要多次移动，所以效率低下
     * 从后往前，先计算需要多少空间，然后从后往前移动，则每个字符只为移动一次，这样效率更高一点。
     * <p>
     * 注意：
     * StringBuffer 里面的 setLength 方法， 为原字符串设置新的长度（用 '\0' 填充），不改变原来的字符串。
     *
     * @param string 待转换的字符串
     * @return 结果
     */
    public static String replaceSpace(String string) {

        StringBuffer str = new StringBuffer(string);

        int count = 0;

        for (int i = 0; i < str.length(); i++) {

            if (str.charAt(i) == ' ') {

                count++;

            }
        }
        int oldIndex = str.length() - 1;

        // 这个setLength 函数第一次用到
        //StringBuffer 里面的 setLength 方法， 为原字符串设置新的长度（用 '\0' 填充），不改变原来的字符串。
        str.setLength(str.length() + count * 2);

        int newIndex = str.length() - 1;

        while (newIndex != oldIndex) {

            if (str.charAt(oldIndex) != ' ') {

                str.setCharAt(newIndex--, str.charAt(oldIndex--));

            } else {

                str.setCharAt(newIndex--, '0');

                str.setCharAt(newIndex--, '2');

                str.setCharAt(newIndex--, '%');

                oldIndex--;

            }
        }

        return str.toString();
    }
}
